#include "ABMDomain.h"
#include "ui_ABMDomain.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel *domain_model;

ABMDomain::ABMDomain(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AmbDominios)
{
    ui->setupUi(this);
    setWindowFlags(Qt::WindowCloseButtonHint);

    domain_model = new QSqlRelationalTableModel(this,enjoylifedb);
    domain_model->setTable("dominio");
    domain_model->setEditStrategy(QSqlRelationalTableModel::OnFieldChange);

    domain_model->setHeaderData(2,Qt::Horizontal,"Dominios Asociados");
    domain_model->setHeaderData(3,Qt::Horizontal,"Primario?");
    domain_model->setHeaderData(4,Qt::Horizontal,"Fecha Alta NIC");
    domain_model->setHeaderData(5,Qt::Horizontal,"Fecha Vto. NIC");

    ui->domains_view->setModel(domain_model);
    ui->domains_view->hideColumn(0);
    ui->domains_view->hideColumn(1);
    ui->domains_view->setAlternatingRowColors(true);
    ui->domains_view->setGridStyle(Qt::SolidLine);
    ui->domains_view->sortByColumn(3,Qt::SortOrder());
    ui->domains_view->setSortingEnabled(true);
    ui->domains_view->horizontalHeader()->setStretchLastSection(true);
    ui->domains_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->domains_view->setColumnWidth(2, 400);

    on_add_domain = false;
    on_edit_domain = false;
    row_edited = -99;

    ui->label_dom->setEnabled(false);
    ui->dominio->setEnabled(false);
    ui->tipo_dominio->setEnabled(false);
    ui->label_dateA->setEnabled(false);
    ui->fecha_alta_nic->setEnabled(false);
    ui->label_dateV->setEnabled(false);
    ui->fecha_vencimiento_nic->setEnabled(false);
    ui->editarBtn->setEnabled(false);
    ui->eliminarBtn->setEnabled(false);
    ui->guardarBtn->setEnabled(false);
    ui->principal->setChecked(true);

    QDate date;
    ui->fecha_alta_nic->setDate(date.currentDate());
    date.setDate(date.currentDate().addYears(1).year(),date.currentDate().month(),date.currentDate().day());
    ui->fecha_vencimiento_nic->setDate(date);

    connect(ui->fecha_alta_nic,SIGNAL(dateChanged(QDate)),this,SLOT(CalculateNICExpirationDate()));

    SelectDomains();
}

ABMDomain::~ABMDomain()
{
    delete ui;
}

/*
 *
 */
void ABMDomain::GetClientDomainsInfo(QString raz_soc)
{
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select nro_cliente,logo_cliente from cliente where razon_social = ";
    stm.append("\'");
    stm.append(raz_soc);
    stm.append("\'");

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query->lastError().text());
        return;
    }

    while (query->next()) {
        ui->nro_cliente->setText(query->value(query->record().indexOf("nro_cliente")).toString());
        ui->razon_social->setText(raz_soc);

        QPixmap* pixmap = new QPixmap();
        pixmap->loadFromData(QByteArray::fromBase64(query->value(query->record().indexOf("logo_cliente")).toByteArray()));

        if (!pixmap->isNull())
            ui->logo_cliente->setPixmap(*pixmap);
    }

    filterDomain = "d_razon_social = '" + raz_soc + "'";
    SelectDomains();
}

/*
 *
 */
void ABMDomain::SelectDomains()
{
    domain_model->setTable("dominio");
    domain_model->setFilter(filterDomain);
    enjoylifedb.transaction();
    if (!domain_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
}

void ABMDomain::on_agregarBtn_clicked()
{
//    connect(ui->fecha_alta_nic,SIGNAL(dateChanged(QDate)),this,SLOT(CalculateNICExpirationDate()));
    if (!ui->dominio->text().isEmpty()) {
        QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("Alerta!"),
                                       "Actualmente está editando un dominio "
                                       "quiere cancelar la operación e ingresar uno nuevo?",
                                       QMessageBox::Yes | QMessageBox::No);

        if (button == QMessageBox::Yes) {
            ui->dominio->clear();
            ui->label_dom->setEnabled(true);
            ui->dominio->setEnabled(true);
            ui->tipo_dominio->setEnabled(true);
            ui->label_dateA->setEnabled(true);
            ui->fecha_alta_nic->setEnabled(true);
            ui->label_dateV->setEnabled(true);
            ui->fecha_vencimiento_nic->setEnabled(true);
            ui->dominio->setFocus();
            on_add_domain = true;
            ui->editarBtn->setEnabled(false);
            ui->eliminarBtn->setEnabled(false);
            ui->guardarBtn->setEnabled(true);
            return;
        }
    }
    else {
        ui->dominio->clear();
        ui->label_dom->setEnabled(true);
        ui->dominio->setEnabled(true);
        ui->tipo_dominio->setEnabled(true);
        ui->label_dateA->setEnabled(true);
        ui->fecha_alta_nic->setEnabled(true);
        ui->label_dateV->setEnabled(true);
        ui->fecha_vencimiento_nic->setEnabled(true);
        ui->dominio->setFocus();
        on_add_domain = true;
        ui->editarBtn->setEnabled(false);
        ui->eliminarBtn->setEnabled(false);
        ui->guardarBtn->setEnabled(true);
    }
}

void ABMDomain::on_guardarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Dominio"),
                                   "¿Está seguro que quiere "
                                   "guardar el dominio " + ui->dominio->text() + "?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        // Se seleccionó la opción de agregar un nuevo dominio.
        if (on_add_domain) {

            if (ui->dominio->text().isEmpty()) {
                QMessageBox::critical(this,"Insertar Dominio",
                                      "Advertencia! Debe ingresar un valor para el dominio");
                return;
            }

            // Se decide guardar el dominio
            QSqlRecord record;

            // Se agrega la razon social
            QSqlField rsField(QStringLiteral("d_razon_social"), QVariant::String);
            rsField.setValue(ui->razon_social->text());
            record.append(rsField);

            // Se agrega el nro de cliente
            QSqlField vdField(QStringLiteral("val_dominio"), QVariant::String);
            vdField.setValue(ui->dominio->text());
            record.append(vdField);

            QSqlField epField(QStringLiteral("es_primaria"), QVariant::Int);
            if (ui->principal->isChecked())
                epField.setValue(1); // Primario
            else
                epField.setValue(0); // Secundario
            record.append(epField);

            QSqlField faNicField(QStringLiteral("fecha_alta_nic"), QVariant::Date);
            faNicField.setValue(ui->fecha_alta_nic->text());
            record.append(faNicField);

            QSqlField fvNicField(QStringLiteral("fecha_vencimiento_nic"), QVariant::Date);
            fvNicField.setValue(ui->fecha_vencimiento_nic->text());
            record.append(fvNicField);

            enjoylifedb.transaction();
            if (!(domain_model->insertRecord(-1, record))) {
                QString error = domain_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo insertar el cliente, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();

            SelectDomains();
        }

        // El usuario hizo click sobre el boton editar.
        if (on_edit_domain) {
            QString filter = "id_dominio = '" + idDomain + "'";
            domain_model->setFilter(filter);
            enjoylifedb.transaction();
            if (!(domain_model->select())) {
                QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            if (domain_model->rowCount() == 1) {
                QSqlRecord record = domain_model->record(0);

                if (ui->dominio->text().isEmpty()) {
                    QMessageBox::critical(this,"Error Editar Dominio",
                                        "Advertencia! Debe ingresar un valor para el dominio");
                    return;
                }
                if (ui->fecha_alta_nic->text().isEmpty()) {
                    QMessageBox::critical(this,"Error Editar Dominio",
                                        "Advertencia! Debe ingresar un valor para la fecha de alta");
                    return;
                }
                if (ui->fecha_vencimiento_nic->text().isEmpty()) {
                    QMessageBox::critical(this,"Error Editar Dominio",
                                        "Advertencia! Debe ingresar un valor para la fecha de vencimiento");
                    return;
                }

                record.setValue("val_dominio", ui->dominio->text());
                if (ui->principal->isChecked())
                    record.setValue("es_primaria", 1);
                else
                    record.setValue("es_primaria", 0);
                record.setValue("fecha_alta_nic", ui->fecha_alta_nic->text());
                record.setValue("fecha_vencimiento_nic", ui->fecha_vencimiento_nic->text());

                domain_model->setRecord(0, record);
                enjoylifedb.transaction();
                if (!domain_model->submitAll()) {
                    QString error = domain_model->lastError().text();
                    QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                            "\n %1").arg(error));
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
            }

            SelectDomains();
        }
        row_edited = -99;
        on_add_domain = false;
        on_edit_domain = false;
        ui->agregarBtn->setEnabled(true);
        ui->editarBtn->setEnabled(false);
        ui->eliminarBtn->setEnabled(false);
        ui->guardarBtn->setEnabled(false);
        ui->dominio->clear();
        ui->label_dom->setEnabled(false);
        ui->dominio->setEnabled(false);
        ui->tipo_dominio->setEnabled(false);
        ui->label_dateA->setEnabled(false);
        ui->fecha_alta_nic->setEnabled(false);
        ui->label_dateV->setEnabled(false);
        ui->fecha_vencimiento_nic->setEnabled(false);
    }
    else
        return;
}

void ABMDomain::on_eliminarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Eleminar Dominio"),
                                   "¿Está seguro que quiere "
                                   "eliminar el dominio '" + ui->dominio->text() + "'?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        enjoylifedb.transaction();
        if (!domain_model->removeRow(ui->domains_view->currentIndex().row())) {
            QMessageBox::critical(this,"Error!", "No se pudo eliminar el dominio, vuelva a intentarlo.");
            enjoylifedb.rollback();
            return;
        }
        QMessageBox::information(this,"Exito!", "El dominio fue eliminado correctamente.",
                                 QMessageBox::Ok);

        domain_model->submitAll();
        enjoylifedb.commit();
    }
    row_edited = -99;
    on_add_domain = false;
    on_edit_domain = false;
    ui->agregarBtn->setEnabled(true);
    ui->editarBtn->setEnabled(false);
    ui->eliminarBtn->setEnabled(false);
    ui->guardarBtn->setEnabled(false);
    ui->dominio->clear();
    ui->label_dom->setEnabled(false);
    ui->dominio->setEnabled(false);
    ui->tipo_dominio->setEnabled(false);
    ui->label_dateA->setEnabled(false);
    ui->fecha_alta_nic->setEnabled(false);
    ui->label_dateV->setEnabled(false);
    ui->fecha_vencimiento_nic->setEnabled(false);
}

void ABMDomain::on_domains_view_clicked(const QModelIndex &index)
{
    if (index.row() != -1) {
        ui->editarBtn->setEnabled(true);
        ui->eliminarBtn->setEnabled(true);
        ui->guardarBtn->setEnabled(true);
        idDomain = domain_model->index(index.row(),0).data().toString();
        ui->dominio->setText(domain_model->index(index.row(),2).data().toString());
        if (domain_model->index(index.row(),3).data().toInt() == 1)
            ui->principal->setChecked(true);
        else
            ui->secundario->setChecked(true);
        ui->fecha_alta_nic->setDate(domain_model->index(index.row(),4).data().toDate());
        ui->fecha_vencimiento_nic->setDate(domain_model->index(index.row(),5).data().toDate());
        ui->label_dom->setEnabled(false);
        ui->dominio->setEnabled(false);
        ui->tipo_dominio->setEnabled(false);
        ui->label_dateA->setEnabled(false);
        ui->fecha_alta_nic->setEnabled(false);
        ui->label_dateV->setEnabled(false);
        ui->fecha_vencimiento_nic->setEnabled(false);
    }
}

void ABMDomain::on_editarBtn_clicked()
{
    ui->label_dom->setEnabled(true);
    ui->dominio->setEnabled(true);
    ui->tipo_dominio->setEnabled(true);
    ui->label_dateA->setEnabled(true);
    ui->fecha_alta_nic->setEnabled(true);
    ui->label_dateV->setEnabled(true);
    ui->fecha_vencimiento_nic->setEnabled(true);
    ui->guardarBtn->setEnabled(true);
    ui->dominio->setFocus();
    on_edit_domain = true;
    row_edited = ui->domains_view->currentIndex().row();
}

void ABMDomain::CalculateNICExpirationDate()
{
    QDate dateV = ui->fecha_alta_nic->date();
    dateV.setDate(dateV.year() + 1, dateV.month(), dateV.day());
    ui->fecha_vencimiento_nic->setDate(dateV);
}

void ABMDomain::on_cerrarBtn_clicked()
{
    close();
}
